﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PetSystem
{
    public partial class Cliente : Form
    {
        public Cliente()
        {
            InitializeComponent();
        }

        private void lblrua_Click(object sender, EventArgs e)
        {

        }

        private void btnsalvaralt_Click(object sender, EventArgs e)
        {
            if (TxtNome.Text.Trim() != "")
            {
                #region Formata os dados do cliente para inserção
                Clientes cliente = new Clientes();
                if (cbPlanos.SelectedValue != null)
                {
                    cliente.Codigo_plano = int.Parse(cbPlanos.SelectedValue.ToString());
                }
                else
                {
                    cliente.Codigo_plano = null;
                }
                if (cbPet.SelectedValue != null)
                {
                    cliente.Codigo_pet = int.Parse(cbPet.SelectedValue.ToString());
                }
                else
                {
                    cliente.Codigo_pet = null;
                }
                cliente.Nome = TxtNome.Text;
                if (mTxtCPF.Text.Replace("_", "").Replace(".", "").Replace("/", "").Trim() != "") cliente.CPF = mTxtCPF.Text.Replace("_", "").Replace(".", "").Replace("/", "").Trim();
                cliente.Rua = TxtRua.Text;
                if (dtNascimento.Text.Replace("/", "").Trim() != "") cliente.Data_nascimento = DateTime.Parse(dtNascimento.Text.Replace("/", "-"));
                cliente.Bairro = TxtBairro.Text;
                cliente.Numero = TxtNumero.Text;
                cliente.complementos = TxtComplementos.Text;
                cliente.Email = TxtEmail.Text;
                if (rblfem.Checked == true)
                {
                    cliente.Sexo = "Feminino";
                }
                if (rblmasc.Checked == true)
                {
                    cliente.Sexo = "Masculino";
                }
                #endregion
                DAO DAO = new DAO();
                if (this.Text.Contains("Novo"))
                {
                    try
                    {
                        DAO.IncluirCliente(cliente);
                        Text = "Editar Cliente " + DAO.UltimoClienteCadastrado().ToString();
                        MessageBox.Show("Cliente " + DAO.UltimoClienteCadastrado().ToString() + " cadastrado", "Cliente Cadastrado", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    }
                    catch (Exception ex)
                    {
                        #region Tratamento de erro ao inserir cliente
                        string mensagem;
                        if (ex.Message.ToString().Contains("valores duplicados"))
                        {
                            mensagem = "Já existe um cliente com o CPF informado.";
                        }
                        else
                        {
                            mensagem = ex.Message.ToString();
                        }
                        MessageBox.Show("Erro ao cadastrar cliente:\n\n " + mensagem, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                        #endregion
                    }
                }
                else
                {
                    try
                    {
                        cliente.Codigo = int.Parse(Text.Substring(15, Text.Length - 15));
                        DAO.AtualizaCliente(cliente);
                        MessageBox.Show("Cliente " + Text.Substring(15, Text.Length - 15) + " atualizado", "Cliente Cadastrado", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    }
                    catch (Exception ex)
                    {
                        #region Tratamento de erro ao atualizar cliente
                        string mensagem;
                        if (ex.Message.ToString().Contains("valores duplicados"))
                        {
                            mensagem = "Já existe um cliente com o CPF informado.";
                        }
                        else
                        {
                            mensagem = ex.Message.ToString();
                        }
                        MessageBox.Show("Erro ao atualizar cliente:\n\n " + mensagem, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                        #endregion
                    }
                }
                Clientes.AtualizaListaDeClientes();
            }
            else
            {
                MessageBox.Show("Digite um nome.", "", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
            }
        }

        private void textBox8_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {

        }

        private void Cliente_Load(object sender, EventArgs e)
        {
            if (Text.Contains("Editar"))
            {
                DAO DAo = new DAO();
                Clientes cliente = new Clientes();
                #region Preenche Drop Planos
                DAO dao = new DAO();
                cbPlanos.DataSource = dao.DropPlanos();
                cbPlanos.ValueMember = "codigo";
                cbPlanos.DisplayMember = "nome";
                cbPlanos.Update();
                #endregion
                #region Preenche Drop Pets
                cbPet.DataSource = dao.DropPets();
                cbPet.ValueMember = "Codigo";
                cbPet.DisplayMember = "Nome";
                cbPet.Update();
                #endregion
                cliente = DAo.ObterCliente(Text.Substring(15, Text.Length - 15));
                TxtBairro.Text = cliente.Bairro.Trim();
                if (cliente.Codigo_plano != null)
                {
                    cbPlanos.SelectedValue = int.Parse(cliente.Codigo_plano.ToString());
                }
                else
                {
                    cbPlanos.SelectedIndex = -1;//Não seleciona nenhum dos itens
                }
                if (cliente.Codigo_pet != null)
                {
                    cbPet.SelectedValue = int.Parse(cliente.Codigo_pet.ToString());
                }
                else
                {
                    cbPet.SelectedIndex = -1;//Não seleciona nenhum dos itens
                }
                TxtComplementos.Text = cliente.complementos.Trim();
                mTxtCPF.Text = cliente.CPF.ToString();
                dtNascimento.Text = cliente.Data_nascimento.ToString().Trim();
                TxtEmail.Text = cliente.Email.Trim();
                TxtNome.Text = cliente.Nome.Trim();
                TxtNumero.Text = cliente.Numero.Trim();
                TxtRua.Text = cliente.Rua.Trim();
                if (cliente.Sexo == "Feminino")
                {
                    rblfem.Checked = true;
                }
                if (cliente.Sexo == "Masculino")
                {
                    rblmasc.Checked = true;
                }
            }
            else
            {
                #region Preenche Drop Planos
                DAO dao = new DAO();
                cbPlanos.DataSource = dao.DropPlanos();
                cbPlanos.ValueMember = "codigo";
                cbPlanos.DisplayMember = "nome";
                cbPlanos.Update();
                cbPlanos.SelectedIndex = -1;
                #endregion
                #region Preenche Drop Pets
                cbPet.DataSource = dao.DropPets();
                cbPet.ValueMember = "codigo";
                cbPet.DisplayMember = "nome";
                cbPet.Update();
                cbPet.SelectedIndex = -1;
                #endregion
            }
        }

        private void cbPet_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                DAO Dao = new DAO();
                Animais pet = new Animais();
                pet = Dao.obterAnimal(cbPet.SelectedValue.ToString());
                lblRacaAnimal.Text = pet.Raca.Trim();
                lblCorPredominanteAnimal.Text = pet.corPredominante.Trim();
                lblIdadeAnimal.Text = (DateTime.Now.Year - pet.Data_nascimento.Year).ToString() + " anos";
                if (pet.Sexo.Trim() == "Macho")
                {
                    rbMacho.Checked = true;
                }
                else
                {
                    rbMacho.Checked = false;
                }
                if (pet.Sexo.Trim() == "Femea")
                {
                    rbFemea.Checked = true;
                }
                else
                {
                    rbFemea.Checked = false;
                }

            }
            catch
            {
                lblRacaAnimal.Text = "";
                lblCorPredominanteAnimal.Text = "";
                lblIdadeAnimal.Text = "";
                rbMacho.Checked = false;
                rbFemea.Checked = false;
            }
        }

        private void TxtEmail_Leave(object sender, EventArgs e)
        {
            try
            {
                var mail = new System.Net.Mail.MailAddress(TxtEmail.Text.Trim());
            }
            catch
            {
                TxtEmail.Text = "";
                MessageBox.Show("Email inválido!", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
            }
        }

        private void mTxtCPF_Leave(object sender, EventArgs e)
        {
            if (mTxtCPF.MaskFull == false)
            {
                mTxtCPF.Text = "";
                MessageBox.Show("CPF inválido!", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
            }
            else
            {
                if (validaCPF(mTxtCPF.Text) == false)
                {
                    mTxtCPF.Text = "";
                    MessageBox.Show("CPF inválido!", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
                }
            }
        }

        private bool validaCPF(string CPF)
        {
            try
            {
                int[] mt1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
                int[] mt2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
                string TempCPF;
                string Digito;
                int soma;
                int resto;

                CPF = CPF.Trim();
                CPF = CPF.Replace(".", "").Replace("/", "").Replace("-", "").Replace(",","");

                if (CPF.Length != 11)
                    return false;

                TempCPF = CPF.Substring(0, 9);
                soma = 0;
                for (int i = 0; i < 9; i++)
                    soma += int.Parse(TempCPF[i].ToString()) * mt1[i];
                resto = soma % 11;
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;
                Digito = resto.ToString();
                TempCPF = TempCPF + Digito;
                soma = 0;
                for (int i = 0; i < 10; i++)
                    soma += int.Parse(TempCPF[i].ToString()) * mt2[i];
                resto = soma % 11;
                if (resto < 2)
                    resto = 0;
                else
                    resto = 11 - resto;
                Digito = Digito + resto.ToString();
                if (CPF.EndsWith(Digito)) //Se o cálculo final for igual ao dígito presento no fim do cpf (Depois da barra 000.000.000/XX) o CPF é passível de ser um CPF válido (A única forma de confirmar isso seria no site da receita federal
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
        }

        private void lblRemoverPlano_Click(object sender, EventArgs e)
        {
            cbPlanos.SelectedIndex = -1;
        }

        private void lblRemoverPet_Click(object sender, EventArgs e)
        {
            cbPet.SelectedIndex = -1;
        }
    }
}
